package cn.iocoder.yudao.module.system.job;

import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
import cn.iocoder.yudao.module.system.dal.dataobject.useractivity.UserActivityStatsDO;
import cn.iocoder.yudao.module.system.dal.dataobject.userbehavior.UserBehaviorStatsDO;
import cn.iocoder.yudao.module.system.service.useractivity.UserActivityStatsService;
import cn.iocoder.yudao.module.system.service.userbehavior.UserBehaviorStatsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Locale;

/**
 * 用户统计数据周期性计算定时任务（周统计和月统计）
 *
 * @author 系统开发团队
 */
@Component
@Slf4j
public class UserStatsWeeklyJob implements JobHandler {

    @Resource
    private UserActivityStatsService userActivityStatsService;

    @Resource
    private UserBehaviorStatsService userBehaviorStatsService;

    @Override
    @TenantJob
    public String execute(String param) throws Exception {
        log.info("[execute] 开始执行用户统计数据周期性计算定时任务");

        try {
            LocalDate today = LocalDate.now();
            
            // 计算上周的周统计
            LocalDate lastWeekStart = today.minusWeeks(1).with(WeekFields.of(Locale.CHINA).dayOfWeek(), 1);
            
            // 计算用户活动周统计
            LocalDate lastWeekEnd = lastWeekStart.plusDays(6); // 周日
            UserActivityStatsDO weeklyActivityStats = userActivityStatsService.calculateWauStats(lastWeekEnd);
            boolean weeklyActivityResult = weeklyActivityStats != null;
            log.info("[execute] 用户活动周统计计算结果：{}, 周开始日期：{}", weeklyActivityResult, lastWeekStart);

            // 计算用户行为周统计
            UserBehaviorStatsDO weeklyBehaviorStats = userBehaviorStatsService.calculateWeeklyBehaviorStats(lastWeekEnd);
            boolean weeklyBehaviorResult = weeklyBehaviorStats != null;
            log.info("[execute] 用户行为周统计计算结果：{}, 周开始日期：{}", weeklyBehaviorResult, lastWeekStart);

            // 如果是月初（1-3号），计算上月的月统计
            boolean monthlyActivityResult = true;
            boolean monthlyBehaviorResult = true;
            
            if (today.getDayOfMonth() <= 3) {
                LocalDate lastMonthEnd = today.minusMonths(1).withDayOfMonth(today.minusMonths(1).lengthOfMonth());
                
                // 计算用户活动月统计
                UserActivityStatsDO monthlyActivityStats = userActivityStatsService.calculateMauStats(lastMonthEnd);
                monthlyActivityResult = monthlyActivityStats != null;
                log.info("[execute] 用户活动月统计计算结果：{}, 月结束日期：{}", monthlyActivityResult, lastMonthEnd);

                // 计算用户行为月统计
                UserBehaviorStatsDO monthlyBehaviorStats = userBehaviorStatsService.calculateMonthlyBehaviorStats(lastMonthEnd);
                monthlyBehaviorResult = monthlyBehaviorStats != null;
                log.info("[execute] 用户行为月统计计算结果：{}, 月结束日期：{}", monthlyBehaviorResult, lastMonthEnd);
            }

            // 返回执行结果
            String result = String.format("周活动统计：%s，周行为统计：%s，月活动统计：%s，月行为统计：%s，计算日期：%s",
                    weeklyActivityResult ? "成功" : "失败",
                    weeklyBehaviorResult ? "成功" : "失败",
                    monthlyActivityResult ? "成功" : "失败",
                    monthlyBehaviorResult ? "成功" : "失败",
                    today);

            log.info("[execute] 完成执行用户统计数据周期性计算定时任务，结果：{}", result);
            return result;

        } catch (Exception e) {
            log.error("[execute] 执行用户统计数据周期性计算定时任务失败", e);
            throw e;
        }
    }
}